package com.cskaoyan.javase.string._3exercise;

/**
 * @description: 小练习
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *
 * String当中的equals方法和hashCode方法都是根据value数组的内容去重写的
 * Debug模式使用的技巧:
 *      1.我们自己写的代码可以Debug,源码也可以
 *      2.在查看源代码,经常需要深入查看方法,会一步步得进入某个方法,这个时候如果想要跳回去就很麻烦了
 *          两个快捷键,光标向前和向后位置:
 *          ctrl + alt + 左右键
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
       /* String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1 == s2); //false
        System.out.println(s1.equals(s2)); // true

        String s3 = new String("hello");
        String s4 = "hello";
        System.out.println(s3 == s4); //false
        System.out.println(s3.equals(s4)); //true

        String s5 = "hello";
        String s6 = "hello";
        System.out.println(s5 == s6); //true
        System.out.println(s5.equals(s6)); //true*/


        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";

        System.out.println(s3 == (s1 + s2)); //false
        System.out.println(s3.equals(s1 + s2)); //true

        System.out.println(s3 == ("hello" + "world")); //true
        System.out.println(s3.equals("hello" + "world")); //true

        /**
         * 使用加号对字符串进行拼接操作，会有下述两种结果
         * - 直接在常量池中创建新的拼接对象,如果该对象已存在,直接共享
         * - 在堆上创建新的拼接对象
         *
         * 经过测试我们发现
         * - 当参与字符串拼接的两个字符串中，至少有一个是以引用变量的形式出现时
         *  - 必然会在堆上创建新的字符串对象
         *    - 原因是变量参与了运算，无法在编译时期确定其值，就不能在编译时期加入常量池
         * - 只有参与字符串拼接运算的两个字符串，都是字符串字面值常量的时候
         *  - 此时不会在堆上创建新的字符串对象，而是在常量池中直接拼接创建对象
         *  - 如果已存在，则不创建新的对象
         *
         */
    }
}
